В этом шаге рассмотрим перенос вещества в пространстве. Создадим проект и приготовимся вращать руками и головой. Добавим в файл stdafx.h следующие строки:
#include <math.h> #define Pi 3.14159
Как вы понимаете, это для синусов и косинусов. Все остальные изменения проекта будут касаться только функции OnDraw(...). Её код теперь таков:
void CExampleView::OnDraw(CDC* pDC)
{
CRect clientRect;
CExampleDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
GetClientRect(&clientRect);
glViewport(0, 0, clientRect.right, clientRect.bottom);
glClearColor (0.5, 0.5, 0.75, 1.0); // цвет фона
glClear (GL_COLOR_BUFFER_BIT); // очистка буфера цвета
glColor3f (1.0, 0.0, 0.5); // текущий цвет примитивов
for(int i=0; i<6; i++)
{
glTranslatef (-0.7f * (float)cos (Pi * i / 3),
0.7f * (float)sin (Pi * i / 3), 0.0);
glRotatef (-60.0f * i, 0, 0, 1);
glBegin (GL_POLYGON);
glVertex2f (-0.25f, -0.25f);
glVertex2f (-0.25f, 0.25f);
glVertex2f (0.25f, 0.25f);
glVertex2f (0.25f, -0.25f);
glEnd();
glRotatef (60.0f * i, 0, 0, 1);
glTranslatef (0.7f * (float)cos (Pi * i / 3),
-0.7f * (float)sin (Pi * i / 3), 0.0);
}
SwapBuffers(pDC->m_hDC);
}
Здесь мы рисуем шесть квадратиков. Но смысл не в том, что мы рисуем, а как. В примере мы шесть раз как бы переносим систему координат. Если быть более точным, то мы 6 раз изменяем матрицу модели, но о матрицах модели и других типах матриц чуть позже. Пока главное понять последовательность действий. Логика такова:
Не знаю кому как, но мне очень помогает рисование преобразований объекта на бумаге. Попробуйте, например, поменять местами glTranslate и glRotate и потом разобраться почему так получилось.
Как я уже говорил когда-то, операции glTranslate и glRotate одни из самых важных в библиотеке OpenGL, поэтому имеет смысл разобраться что тут к чему на примере 2D, чтобы в 3D к этому не возвращаться.